#include "main.h"
#include <rtthread.h>

static thread1_stack[64];
static struct rt_thread thread1;

static thread2_stack[64];
static struct rt_thread thread2;

static void Board_GPIO_Init();

void led_entry1(){
	while(1){
		// HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
		// rt_thread_delay(500);
		// HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
		// rt_thread_delay(500);
		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
		rt_thread_delay(500);
	}
}

void led_entry2(){
	while(1){
		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
		rt_thread_delay(500);
		// HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
		// rt_thread_delay(500);
		// HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
		// rt_thread_delay(500);
	}
}

int main(void){
	HAL_Init();
	Board_GPIO_Init();

    /* 初始化线程1的线程控制块 */
    rt_thread_init(&thread1,
                    "thread1",                        // 线程的名字
                    led_entry1,                     // 线程的入口函数
                    RT_NULL,                           // 线程的入口函数参数
                    &thread1_stack[0],        // 线程栈空间的分配
                    sizeof(thread1_stack),                               // 线程栈空间的大小
                    6,                                // 线程的优先级
                    10);                               // 线程的选项

    /* 启动线程1 */
    rt_thread_startup(&thread1);

	/* 初始化线程1的线程控制块 */
    rt_thread_init(&thread2,
                    "thread2",                        // 线程的名字
                    led_entry2,                     // 线程的入口函数
                    RT_NULL,                           // 线程的入口函数参数
                    &thread2_stack[0],        // 线程栈空间的分配
                    sizeof(thread2_stack),                               // 线程栈空间的大小
                    6,                                // 线程的优先级
                    10);                               // 线程的选项

    /* 启动线程1 */
    rt_thread_startup(&thread2);

    return 0;
}

static void Board_GPIO_Init(){
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	// 使能GPIOB时钟
	__HAL_RCC_GPIOB_CLK_ENABLE();
	// 设置GPIO初始化状态
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
	// 初始化GPIO
	GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_0|GPIO_PIN_3;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}